/*
 * Copyright (c) 2025 CAX Conversion Project
 */
package com.comac.ins.isfd.service.impl;


import com.anwen.mongo.mapper.BaseMapper;
import com.anwen.mongo.service.impl.ServiceImpl;
import com.comac.ins.common.core.exception.base.BaseException;
import com.comac.ins.isfd.constant.MongoDataConstant;
import com.comac.ins.isfd.service.IIsfdDatabaseDynamicMongoService;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class IsfdDatabaseDynamicMongoServiceImpl extends ServiceImpl<BaseMapper> implements IIsfdDatabaseDynamicMongoService, MongoDataConstant {

    @Autowired
    private BaseMapper baseMapper;

    @Autowired
    private MongoClient mongoClient;

    /**
     * 创建一个 MongoDB 集合
     * @param collectionName 集合名称
     * @return 创建结果
     */
    @Override
    public void createCollection(String collectionName) {
        MongoDatabase database = mongoClient.getDatabase(DB_NAME);
        // 判断集合是否已经存在
        if (database.listCollectionNames().into(new ArrayList<>()).contains(collectionName)) {
            log.error("MongoDB中表已存在: " + collectionName);
            throw new BaseException("MongoDB中表已存在: " + collectionName);
        }
        // 创建集合
        try {
            database.createCollection(collectionName);
        } catch (Exception e) {
            log.error("MongoDB中创建表失败，" + e);
            throw new BaseException("MongoDB中创建表失败，" + e);
        }
    }

    /**
     * 删除 MongoDB 集合
     * @param collectionName 集合名称
     */
    public void dropCollection(String collectionName) {
        MongoDatabase database = mongoClient.getDatabase(DB_NAME);
        // 判断集合是否存在
        if (!database.listCollectionNames().into(new ArrayList<>()).contains(collectionName)) {
            log.error("MongoDB中表不存在: " + collectionName);
            throw new BaseException("MongoDB中表不存在: " + collectionName);
        }
        // 删除集合
        try{
            MongoCollection<Document> collection = database.getCollection(collectionName);
            collection.drop();
        } catch (Exception e){
            log.error("删除MongoDB表失败，" + e);
            throw new BaseException("删除MongoDB表失败，" + e);
        }
    }

    /**
     * 插入数据到指定集合
     *
     * @param collectionName 集合名称
     * @param data 数据
     */
    @Override
    public Boolean save(String collectionName, Map<String, Object> data) {
        return baseMapper.save(collectionName, data);
    }

    /**
     * 批量插入数据到指定集合
     *
     * @param collectionName 集合名称
     * @param dataList 数据
     */
    @Override
    public Boolean saveBatch(String collectionName, List<Map<String, Object>> dataList) {
        return baseMapper.saveBatch(collectionName, dataList);
    }

    /**
     * 根据条件查询数据
     *
     * @param collectionName 集合名称
     * @param filter 查询条件
     * @return 查询结果
     */
    @Override
    public List<Map<String, Object>> find(String collectionName, Map<String, Object> filter) {
        return null;
    }

    /**
     * 根据条件更新数据
     *
     * @param collectionName 集合名称
     * @param filter 查询条件
     * @param update 更新内容
     */
    public void update(String collectionName, Map<String, Object> filter, Map<String, Object> update) {
    }

    /**
     * 根据条件删除数据
     *
     * @param collectionName 集合名称
     * @param filter 删除条件
     */
    public void delete(String collectionName, Map<String, Object> filter) {
    }
}
